package com.gkzf.ai.module.crm.util.extracted;

import com.gkzf.ai.module.crm.util.YearlyRecord;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 *     <tr>
 *     <td></td>
 *     <td>1</td>
 *     <td>2</td>
 *     <td>3</td>
 *     <td>4</td>
 *     <td>5</td>
 *     <td>6</td>
 *     <td>7</td>
 *     <td>8</td>
 *     <td>9</td>
 *     <td>10</td>
 *     <td>11</td>
 *     <td>12</td>
 *   </tr>
 *   <tr>
 *     <td rowspan="2">2025</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *     <td>*</td>
 *   </tr>
 *   <tr>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *     <td>0</td>
 *   </tr>
 *
 */
@Slf4j
public class ParseTwoRowRepaymentTable implements Extracted{
    @Override
    public Map<String, YearlyRecord> extractedData(String html, Set<String> SWAP_TRIGGER_CHARS) {
        Map<String, YearlyRecord> yearDataMap = new HashMap<>();

        // 对表格片段使用 parseBodyFragment
        Document doc = Jsoup.parseBodyFragment(html);

        // 选择所有表格行
        Elements rows = doc.select("tr");

        // 遍历行，注意：我们需要同时处理两行来获取一年的数据
        // 假设第一行是表头，数据从第二行开始 (索引 1)
        // 每两年数据占用两行 (行 i 和 行 i+1)，所以步长是 2
        for (int i = 1; i < rows.size() - 1; i += 2) { // 从索引 1 开始，每次跳过 2 行，确保有 i+1 行存在
            Element yearRow = rows.get(i);     // 包含年份和第一个列表数据
            Element dataRow2 = rows.get(i+1); // 包含第二个列表数据

            Elements yearTds = yearRow.select("td");
            Elements dataRow2Tds = dataRow2.select("td");

            // 验证这两行是否有足够的列 (第一列是年/空，后面是 12 个数据列)
            // yearRow 需要至少 13 列 (年 + 12个月)
            // dataRow2 需要至少 13 列 (空 + 12个月)

//            if (yearTds.size() < 7 || dataRow2Tds.size() < 7) {
//                log.info("Skipping row pair starting at index " + i + " due to insufficient columns.");
//                continue; // 跳过列数不足的行对
//            }

            // 第一个 td (yearRow 的第一个 td) 是年份
            String year = yearTds.first().text().trim();

            // 为该年份创建一个新的 YearlyRecord
            YearlyRecord record = new YearlyRecord(year);

            // 遍历数据 td（从第二个 td 开始，即索引 1，直到第 13 个 td，索引 12）
            // 这对应于 12 个月份的数据
            for (int j = 1; j < 13; j++) { // 从索引 1 开始，最多到 12
                // 获取 yearRow (第二行) 对应月份的 td 的文本内容
                String valueFromRow2 = yearTds.get(j).text().trim();

                // 获取 dataRow2 (第三行) 对应月份的 td 的文本内容
                String valueFromRow3 = dataRow2Tds.get(j).text().trim();

                // 将提取并清理后的值添加到记录的列表中
                // valueFromRow2 添加到 list1， valueFromRow3 添加到 list2
                record.addDataPoint(valueFromRow2, valueFromRow3);
            }
            // --- 添加检查和互换逻辑 ---
            boolean shouldSwap = false;
            // 遍历 record.list1 中的每个值
            for (String value : record.getMonthList()) {
                try {
                    // 尝试将值解析为整数
                    int num = Integer.parseInt(value);
                    // 如果解析成功并且值大于 7
                    if (num > 7) {
                        shouldSwap = true; // 设置互换标志
                        break;             // 找到一个大于7的值就足够了，停止检查
                    }
                } catch (NumberFormatException e) {
                    // 如果值不是有效的数字，parseInt 会抛异常。
                    // 非数字的值不能大于 7，所以捕获异常后不做任何处理，继续检查下一个值。
                }
            }
            // --- 添加基于 list2 内容的检查和互换逻辑 ---
            // 遍历 record.list2 (它存储了原始的 Value3) 中的每个值
            for (String value : record.getMoneyList()) {
                // 检查值是否是我们定义的触发字符集合中的一个
                if (SWAP_TRIGGER_CHARS.contains(value)) {
                    shouldSwap = true; // 设置互换标志
                    break;             // 找到一个匹配的字符就足够了，停止检查
                }
            }

            // 如果需要互换
            if (shouldSwap) {
                log.info("年份 " + year + " 的数据需要互换 List1 和 List2 (List1中包含 > 7 的值)");
                // 互换 list1 和 list2 的内容
                List<String> temp = record.getMonthList();
                record.setMonthList(record.getMoneyList());
                record.setMoneyList(temp);
            }
            // --- 互换逻辑结束 ---

            // 将记录存储在 Map 中
            yearDataMap.put(year, record);
        }

        return yearDataMap;
    }
}
